package com.zc.utilclass.servletutil.main;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BaseServlet
 * 设置自己的servlet基类
 */
@WebServlet("/BaseServlet")
public class ServletUtil extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final int N = 3; //设置最多可以传N个参数
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletUtil() {
        super();
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*//获取对应的请求参数
		String methodName = request.getParameter("method");
		try {
			// 利用反射获取方法
			Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			//例如：getBooks方法为protected,而非public,故必须进行此操作 
			method.setAccessible(true);
			// 执行相应的方法
			method.invoke(this, request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}*/

		// 最多N个参数
		// 其中paramName[0]是参数名，paramValue[0]是要调用的方法名
		// 其中paramName[1]是第一个参数名，paramValue[1]是第一个参数值
		String[] paramName = new String[N]; //参数名称
		String[] paramValue = new String[N];
		//Object[] paramValue = new Object[N]; //参数值
		int i = 0;
		//request.getParameterNames()返回一个枚举类型
		Enumeration<String> paramNames = request.getParameterNames();
		//System.out.println("----参数----\n");
		while (paramNames.hasMoreElements()) {
			// 获取参数名称
			paramName[i] = (String) paramNames.nextElement();
			// 解决中文参数乱码，先iso-8859-1编码，再utf-8解码    
			paramName[i] = new String ((paramName[i]).getBytes("ISO-8859-1"), "UTF-8");
			
			// 获取相应参数名称对应的值
			paramValue[i] = request.getParameter(paramName[i]);
			// 解决中文参数乱码，先iso-8859-1编码，再utf-8解码       
			//if(paramValue[i] instanceof String) {
				//String strmy = String.valueOf(paramValue[i]);
			paramValue[i] = new String ((paramValue[i]).getBytes("ISO-8859-1"), "UTF-8");
			//}
			//System.out.println(paramName[i] + ":" + paramValue[i]);
			i++;
		}
		//System.out.println("----------\n");
		// 在网页上显示的内容
		String str1 = "";
		try {
			if (i == 1) { //不带参数
				// 利用反射获取方法
				Method method = getClass().getDeclaredMethod(paramValue[0]);
				// 例如：getBooks方法为protected,而非public,故必须进行此操作
				method.setAccessible(true);
				// 执行相应的方法
				str1 = (String) method.invoke(this);
			} else if (i == 2) { //带1个参数
				// 利用反射获取方法
				Method method = getClass().getDeclaredMethod(paramValue[0], String.class);
				// 例如：getBooks方法为protected,而非public,故必须进行此操作
				method.setAccessible(true);
				// 执行相应的方法
				str1 = (String) method.invoke(this, paramValue[1]);
			} else if (i == 3) { //带2个参数
				// 利用反射获取方法
				Method method = getClass().getDeclaredMethod(paramValue[0], String.class, String.class);
				// 例如：getBooks方法为protected,而非public,故必须进行此操作
				method.setAccessible(true);
				// 执行相应的方法
				str1 = (String) method.invoke(this, paramValue[1], paramValue[2]);
			}
			// 显示在页面上
			//response.setCharacterEncoding("GBK");
			//response.setCharacterEncoding("UTF-8");
			//response.getWriter().write(str1);
			response.setContentType("text/json;charset=UTF-8");
			response.setCharacterEncoding("utf-8");
			response.resetBuffer();
			ServletOutputStream out;
			out = response.getOutputStream();
			out.write(str1.getBytes("utf-8"));
			out.flush();
			out.close();	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
